#include "myCAN\myCAN.h"


/*
 * @brief  CAN发送函数
 * @param  hcan: CAN句柄
 * @param  StdId: 标准帧ID
 * @param  pData: 数据指针
 * @param  Len: 数据长度
 * @作者: 跳河轻生的鱼
 * @日期: 2024-12-14
 */
void myCAN_Transmit(CAN_HandleTypeDef *hcan, uint32_t StdId, uint8_t *pData, uint8_t Len)
{
    CAN_TxHeaderTypeDef TxHeader;
    uint32_t Timeout = 0;
    uint32_t pTxMailbox;
    TxHeader.StdId = StdId;                                    // 标准帧ID
    TxHeader.RTR = CAN_RTR_DATA;                               // 数据帧
    TxHeader.IDE = CAN_ID_STD;                                 // 标准帧
    TxHeader.DLC = Len;                                        // 数据长度
    while(HAL_CAN_AddTxMessage(hcan, &TxHeader, pData, &pTxMailbox) != HAL_OK)
    {
        Timeout++;
        /* 超时处理 */
        if(Timeout > 100000)//大概7200为100us
        {
            break;
        }
        
    }
}


uint8_t myCAN_Receive(CAN_HandleTypeDef *hcan, uint32_t *StdId, uint8_t *pData, uint8_t *Len)
{
    CAN_RxHeaderTypeDef RxHeader;
    uint32_t fifoLevel = HAL_CAN_GetRxFifoFillLevel(hcan, CAN_RX_FIFO0);  // 获取 FIFO0 的接收消息数量
    if (fifoLevel>0)  // 检查 FIFO0 是否有接收到的消息
    {
        if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, pData) == HAL_OK)
        {
            // 处理接收到的消息
            // RxHeader 包含消息头信息（如ID、DLC等）
            *StdId = (RxHeader.IDE == CAN_ID_STD) ? RxHeader.StdId : RxHeader.ExtId;
            // RxData 是接收到的数据
            *Len = RxHeader.DLC;
        }
    }


}